package com.unicorn.util.common;


import org.apache.commons.lang.StringUtils;

import javax.mail.*;
import javax.mail.internet.*;
import java.util.Date;
import java.util.Properties;
import java.util.Vector;

public class MailUtil {

	private String to ; // 收件人

	private String from ; // 发件人

	private	String host; // smtp主机

	private	String username ;

	private	String password;

	private	String filename; // 附件文件名

	private	String subject ; // 邮件主题

	private	String content; // 邮件正文

	private	Vector file = new Vector(); // 附件文件集合

	/**
	 * <br/>
	 * 方法说明：默认构造器 <br/>
	 * 输入参数： <br/>
	 * 返回类型：
	 */
	public MailUtil() {
	}

	/**
	 * <br/>
	 * 方法说明：构造器，提供直接的参数传入 <br/>
	 * 输入参数： <br/>
	 * 返回类型：
	 */
	public MailUtil(String to, String from, String smtpServer, String username,
			String password, String subject, String content) {
		this.to = to;
		this.from = from;
		this.host = smtpServer;
		this.username = username;
		this.password = password;
		this.subject = subject;
		this.content = content;
	}

	/**
	 * <br/>
	 * 方法说明：设置邮件服务器地址 <br/>
	 * 输入参数：String host 邮件服务器地址名称 <br/>
	 * 返回类型：
	 */
	public void setHost(String host) {
		this.host = host;
	}

	/**
	 * <br/>
	 * 方法说明：设置登录服务器校验密码 <br/>
	 * 输入参数： <br/>
	 * 返回类型：
	 */
	public void setPassWord(String pwd) {
		this.password = pwd;
	}

	/**
	 * <br/>
	 * 方法说明：设置登录服务器校验用户 <br/>
	 * 输入参数： <br/>
	 * 返回类型：
	 */
	public void setUserName(String usn) {
		this.username = usn;
	}

	/**
	 * <br/>
	 * 方法说明：设置邮件发送目的邮箱 <br/>
	 * 输入参数： <br/>
	 * 返回类型：
	 */
	public void setTo(String to) {
		this.to = to;
	}

	/**
	 * <br/>
	 * 方法说明：设置邮件发送源邮箱 <br/>
	 * 输入参数： <br/>
	 * 返回类型：
	 */
	public void setFrom(String from) {
		this.from = from;
	}

	/**
	 * <br/>
	 * 方法说明：设置邮件主题 <br/>
	 * 输入参数： <br/>
	 * 返回类型：
	 */
	public void setSubject(String subject) {
		this.subject = subject;
	}

	/**
	 * <br/>
	 * 方法说明：设置邮件内容 <br/>
	 * 输入参数： <br/>
	 * 返回类型：
	 */
	public void setContent(String content) {
		this.content = content;
	}

	/**
	 * <br/>
	 * 方法说明：把主题转换为中文 <br/>
	 * 输入参数：String strText <br/>
	 * 返回类型：
	 */
	public String transferChinese(String strText) {
		try {
			strText = MimeUtility.encodeText(new String(strText.getBytes(),
					"UTF-8"), "GB2312", "B");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return strText;
	}

	/**
	 * <br/>
	 * 方法说明：往附件组合中添加附件 <br/>
	 * 输入参数： <br/>
	 * 返回类型：
	 */
	public void attachfile(String fname) {
		file.addElement(fname);
	}

	/**
	 * <br/>
	 * 方法说明：发送邮件 <br/>
	 * 输入参数： <br/>
	 * 返回类型：boolean 成功为true，反之为false
	 */
	public boolean sendMail() {

		// 构造mail session
		Properties props = System.getProperties();
		props.put("mail.smtp.host", host);
		props.put("mail.smtp.auth", "true");

		Session session = Session.getDefaultInstance(props,
				new Authenticator() {
					@Override
					public PasswordAuthentication getPasswordAuthentication() {
						return new PasswordAuthentication(username, password);
					}
				});

		try {
			// 构造MimeMessage 并设定基本的值
			MimeMessage msg = new MimeMessage(session);
			msg.setFrom(new InternetAddress(from));
			System.out.println(from);

			InternetAddress[] address = { new InternetAddress(to) };
			msg.setRecipients(Message.RecipientType.TO, address);
			subject = transferChinese(subject);
			msg.setSubject(subject);

			// 构造Multipart
			Multipart mp = new MimeMultipart();

			// 向Multipart添加正文
			MimeBodyPart mbpContent = new MimeBodyPart();
			mbpContent.setText(content);
			// 向MimeMessage添加（Multipart代表正文）
			mp.addBodyPart(mbpContent);

			// 向Multipart添加附件
			/*
			 * Enumeration efile = file.elements(); while
			 * (efile.hasMoreElements()) {
			 * 
			 * MimeBodyPart mbpFile = new MimeBodyPart(); filename =
			 * efile.nextElement().toString(); FileDataSource fds = new
			 * FileDataSource(filename); mbpFile.setDataHandler(new
			 * DataHandler(fds)); mbpFile.setFileName(fds.getName());
			 * //向MimeMessage添加（Multipart代表附件） mp.addBodyPart(mbpFile); }
			 * 
			 * file.removeAllElements();
			 */
			// 向Multipart添加MimeMessage
			msg.setContent(mp);
			msg.setSentDate(new Date());
			// 发送邮件
			Transport.send(msg);

		} catch (MessagingException mex) {
			mex.printStackTrace();
			Exception ex = null;
			if ((ex = mex.getNextException()) != null) {
				ex.printStackTrace();
			}
			return false;
		}
		return true;
	}

	/**
	 * <br/>
	 * 方法说明：主方法，用于测试 <br/>
	 * 输入参数： <br/>
	 * 返回类型：
	 */
	public static void main(String[] args) {
		MailUtil sendmail = new MailUtil();
		//设置邮箱服务器,当前位163邮箱服务器
		sendmail.setHost("smtp.163.com");
		//发件人姓名
		sendmail.setUserName("fang1326623951@163.com");
		//发件人邮箱密码
		sendmail.setPassWord("322622fang.");
		//收件人邮箱地址
		sendmail.setTo("amosworkgroup@126.com");
		//发件人邮箱地址
		sendmail.setFrom("fang1326623951@163.com");
		//邮件主题
		sendmail.setSubject("密码取回");
		//邮件内容
		sendmail.setContent("你好，你的密码是：222");
		sendmail.sendMail();
	}
} // end
